package com.LeeG.work.Sort;

import com.LeeG.work.Sort.*;
import com.LeeG.work.Sort.cmp.*;

import java.util.Random;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * @author LeeG
 * @Description: 需要写一个计时器和自动生成百万级别测试数据
 * @Description: 设计思想：子类继承抽象类
 *               (以接口的形式，是否也可以？  可以研究下 )
 *               最终对比抽象类和接口的区别！
 *               Java基础 设计模式 多线程  算法
 *
 *               待解决的问题如下：
 *               1. 非整型怎么办？如何引入泛型
 *               2. 自定义对象如何比较？
 *               3. 输出结果要排序，根据耗时最少排序
 * @date 2021/1/17 18:21
 */
public class Main {

    /**
     * 最大数量
     */
    private static final int maxSize = 10000;

    /**
     * 最大值
     */
    private static final int maxValue = 1000000;

    public static void main(String[] args) {
        int[] arr1 = generalRandomArray(maxSize, maxValue);
        function(copyArray(arr1),
                new BubbleSort01(),
                //new BubbleSort02(),
                //new BubbleSort03(),
                new SelectionSort()
                //new HeapSort(),
                //new InsertSort(),
                //new InsertSortNoSwap(),
                //new InsertSortBinarySearch(),
                //new MergeSort(),
                //new QuickSortFillPit(),
                //new QuickSortDoublePointer(),
                //new ShellSort(),
                //new CountingSort()
        );
    }

    @SuppressWarnings("null")
    public static int[] generalRandomArray(int maxSize, int maxValue) {
        int[] arr = new int[maxSize];
        Random rand = new Random();
        for(int i = 0; i < maxSize; i++) {
            arr[i] = rand.nextInt(maxValue) + 1;
        }
        return arr;
    }

    @SuppressWarnings("null")
    public static int[] copyArray(int[] arr) {
        int[] copyArray = new int[arr.length];
        for(int i = 0; i < arr.length; i++) {
            copyArray[i] = arr[i];
        }
        return copyArray;
    }

    public static void function(int[] arr, Sort... sorts) {
        String className = null;
        for (Sort sort : sorts) {
            className = sort.getClass().getSimpleName();
            System.out.printf("%-10s\t\t", SortNameEnum.valueOf(className).getChainName());
            sort.sort(copyArray(arr));
            System.out.println("---------------------------------------------------------------------------------");
            try{ TimeUnit.SECONDS.sleep(1);} catch(InterruptedException e){e.printStackTrace();}
        }
    }
}



